Skip to content

fix: make a marketplace install actually work - #10

Merged
stormer78 merged 1 commit into
mainfrom
fix/marketplace-install
Aug 24, 2026
Merged

fix: make a marketplace install actually work#10
stormer78 merged 1 commit into
mainfrom
fix/marketplace-install

Conversation

@stormer78

Copy link
Copy Markdown
Contributor

Two things were broken for anybody installing this the documented way.

1. The install command could not work

setup and install.sh both printed:

$ claude plugin install vta-agent-memory
✗ Failed to install plugin "vta-agent-memory": Plugin "vta-agent-memory" not found in any configured marketplace

install resolves against configured marketplaces, so it needs two commands and the qualified name:

claude plugin marketplace add OpenVTC/vta-agent-memory
claude plugin install vta-agent-memory@vta-agent-memory

Verified — both now succeed.

2. …and the install produced a plugin that could not run

.mcp.json and hooks/hooks.json invoke ${CLAUDE_PLUGIN_ROOT}/bin/vta-agent-memory. When installed from a marketplace that directory is a fresh git clone — and bin/ was gitignored, because it held a copied build artifact.

So the MCP server and the SessionStart hook both pointed at a file that does not exist. Verified against the real installed copy:

$ ls ~/.claude/plugins/marketplaces/vta-agent-memory
Cargo.lock  Cargo.toml  CLAUDE.md  commands  hooks  LICENSE
README.md   scripts     skills     src       tests
                                      ← no bin/

The plugin installs, reports "enabled", and does nothing.

The fix

bin/vta-agent-memory is now a committed shell shim that execs the real binary: $VTA_AGENT_MEMORY_BIN, then ~/.cargo/bin, then a local target/, then PATH. install.sh does cargo install instead of copying into bin/.

Its exit code differs by subcommand, because the two callers have opposite contracts:

$ ./bin/vta-agent-memory recall --format json   # no binary installed
recall exit=0   ← a missing binary must never fail a session at start-up
$ ./bin/vta-agent-memory serve
serve  exit=1   ← everything else fails loudly

with a message naming the fix.

CI guards

The Rust build cannot see any of this, so three checks were added:

  • the shim is tracked, executable, and git mode 100755 — if bin/ is ever gitignored again, CI fails rather than the plugin silently doing nothing
  • every ${CLAUDE_PLUGIN_ROOT} path in .mcp.json and hooks.json resolves in a clean checkout, which is exactly what a marketplace install is

Testing

cargo test — 84 pass, clippy clean, fmt clean. Shim behaviour verified in an isolated directory with no binary reachable. New CI steps dry-run locally. claude plugin marketplace add + install verified end to end against the real repo.

Two things were broken for anybody installing this the documented way.

**The install command could not work.** setup and install.sh both printed
`claude plugin install vta-agent-memory`, which resolves only against
*configured* marketplaces — so it fails with 'not found in any configured
marketplace' until the marketplace is added. It needs two commands, and
the qualified name:

  claude plugin marketplace add OpenVTC/vta-agent-memory
  claude plugin install vta-agent-memory@vta-agent-memory

**And the install produced a plugin that could not run.** .mcp.json and
hooks.json invoke ${CLAUDE_PLUGIN_ROOT}/bin/vta-agent-memory. When
installed from a marketplace that directory is a fresh git clone — and
bin/ was gitignored, because it held a copied build artifact. So the MCP
server and the hook both pointed at a file that does not exist. Verified
against the real installed copy at
~/.claude/plugins/marketplaces/vta-agent-memory: no bin/ at all.

bin/vta-agent-memory is now a committed shell shim that execs the real
binary — $VTA_AGENT_MEMORY_BIN, then ~/.cargo/bin, then a local target/,
then PATH. install.sh does `cargo install` instead of copying.

The shim's exit code differs by subcommand, because its two callers have
opposite contracts: `recall` exits 0 so a missing binary never fails a
session at start-up, everything else exits 1 so it fails loudly.

CI gains three guards, since this is a class of breakage the Rust build
cannot see: the shim is tracked, executable, and mode 100755; and every
${CLAUDE_PLUGIN_ROOT} path in the manifests resolves in a clean checkout.

Signed-off-by: Glenn Gore <glenn.gore@gmail.com>
@stormer78
stormer78 merged commit edf1d38 into main Aug 24, 2026
3 checks passed
@stormer78
stormer78 deleted the fix/marketplace-install branch August 24, 2026 14:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant